


import bpy

from 节点.全局控制.Node.数据编辑.物体 import bl_修改器公共选项

import 节点.全局控制.Node.节点和插座基类.bl_节点基类 as 基类

import engine.initLIB.load_dll as engineLib
import ctypes



engineLib.flexCAPI.f_创建厚度修改器节点.restype = ctypes.c_bool





def f_update_修改器可视(self, context):
	修改对象 = self.inputs['修改对象'].f_getData()
	bl_修改器公共选项.f_批量update_修改器可视(修改对象, self.m_修改器名称, self.m_是否显示)


def f_update_修改器可渲(self, context):
	修改对象 = self.inputs['修改对象'].f_getData()
	bl_修改器公共选项.f_批量update_修改器可渲(修改对象, self.m_修改器名称, self.m_是否渲染)





class C_Node_厚度修改器(基类.C_Node_基类):
	bl_dname = 'bl_node_厚度修改器'
	bl_label = '厚度修改器'
	bl_icon = 'MOD_SOLIDIFY'
	
	m_修改器名称 = bpy.props.StringProperty(name="修改器名称", default='Solidify')
	m_是否渲染 = bpy.props.BoolProperty(default=True, update=f_update_修改器可渲)
	m_是否显示 = bpy.props.BoolProperty(default=True, update=f_update_修改器可视)
	m_是否编辑模式显示 = bpy.props.BoolProperty()
	
	
	def init(self, context):
		super(C_Node_厚度修改器, self).f_init(context)

		self.inputs.new('C_Socket_物体_Array1D', name='修改对象')

		self.inputs.new('C_Socket_F32_Array1D', name='厚度')
		self.inputs.new('C_Socket_F32_Array1D', name='钳制')
		self.inputs.new('C_Socket_F32_Array1D', name='偏移')
		self.inputs.new('C_Socket_F32_Array1D', name='内折痕')
		self.inputs.new('C_Socket_F32_Array1D', name='外折痕')
		self.inputs.new('C_Socket_F32_Array1D', name='框')

		self.inputs.new('C_Socket_Bool_Array1D', name='反转法线')
		self.inputs.new('C_Socket_Bool_Array1D', name='均衡厚度')
		self.inputs.new('C_Socket_Bool_Array1D', name='高品质法线')
		self.inputs.new('C_Socket_Bool_Array1D', name='填充边缘')
		self.inputs.new('C_Socket_Bool_Array1D', name='Only Rim')

		self.inputs.new('C_Socket_I32_Array1D', name='材质编号')
		self.inputs.new('C_Socket_I32_Array1D', name='偏移框')
		
		self.f_toCPP(self.id_data)
		self.m_修改器名称 = 'Solidify'

		


	def draw_buttons(self, context, layout):
		显示选项布局 = layout.row(align=True)
		显示选项布局.prop(self, 'm_修改器名称', icon='MOD_SOLIDIFY')
		显示选项布局.prop(self, 'm_是否渲染', icon='RESTRICT_RENDER_OFF', icon_only=True)
		显示选项布局.prop(self, 'm_是否显示', icon='RESTRICT_VIEW_OFF', icon_only=True)
		显示选项布局.prop(self, 'm_是否编辑模式显示', icon='EDITMODE_HLT', icon_only=True)
		
	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建厚度修改器节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			f_update_修改器可渲(self, None)
			f_update_修改器可视(self, None)

			self.inputs['厚度'].f_setData(0.01)
			self.inputs['钳制'].f_update()
			self.inputs['偏移'].f_setData(-1.0)
			self.inputs['内折痕'].f_update()
			self.inputs['外折痕'].f_update()
			self.inputs['框'].f_update()

			self.inputs['反转法线'].f_update()
			self.inputs['均衡厚度'].f_update()
			self.inputs['高品质法线'].f_update()
			self.inputs['填充边缘'].f_setData(True)
			self.inputs['Only Rim'].f_update()

			self.inputs['材质编号'].f_update()
			self.inputs['偏移框'].f_update()
			
			self.use_custom_color = True
			self.color = bl_UI配色.g_Bl修改器节点颜色



	def f_update(self):
		修改对象 = self.inputs['修改对象'].f_getData()
		对象数量 = len(修改对象)
		if 对象数量 <= 0 : return False
			
		厚度, 厚度是否独立 = 基类.f_插座数据是否独立(self, '厚度', 对象数量)
		钳制, 钳制是否独立 = 基类.f_插座数据是否独立(self, '钳制', 对象数量)
		偏移, 偏移是否独立 = 基类.f_插座数据是否独立(self, '偏移', 对象数量)
		
		反转法线, 反转法线是否独立 = 基类.f_插座数据是否独立(self, '反转法线', 对象数量)
		均衡厚度, 均衡厚度是否独立 = 基类.f_插座数据是否独立(self, '均衡厚度', 对象数量)
		填充边缘, 填充边缘是否独立 = 基类.f_插座数据是否独立(self, '填充边缘', 对象数量)
		高品质法线, 高品质法线是否独立 = 基类.f_插座数据是否独立(self, '高品质法线', 对象数量)
		
		
		index = 0
		for obj in 修改对象:
			修改器ID = obj.modifiers.find(self.m_修改器名称)
			if 修改器ID >= 0 :
				修改器 = obj.modifiers[修改器ID]
			else:
				修改器 = obj.modifiers.new(self.m_修改器名称, 'SOLIDIFY')
				self.m_修改器名称 = 修改器.name

			#bl_修改器公共选项.f_set修改器可视(修改器, self.m_是否显示, self.m_是否渲染)



			if 厚度是否独立 :
				修改器.thickness = 厚度[index]
			else:
				修改器.thickness = 厚度

			if 钳制是否独立 :
				修改器.thickness_clamp = 钳制[index]
			else:
				修改器.thickness_clamp = 钳制

			if 偏移是否独立 :
				修改器.offset = 偏移[index]
			else:
				修改器.offset = 偏移


			if 反转法线是否独立 :
				修改器.use_flip_normals = 反转法线[index]
			else:
				修改器.use_flip_normals = 反转法线


			if 均衡厚度是否独立 :
				修改器.use_even_offset = 均衡厚度[index]
			else:
				修改器.use_even_offset = 均衡厚度


			if 高品质法线是否独立 :
				修改器.use_quality_normals = 高品质法线[index]
			else:
				修改器.use_quality_normals = 高品质法线


			if 填充边缘是否独立 :
				修改器.use_rim = 填充边缘[index]
			else:
				修改器.use_rim = 填充边缘
			
			index += 1
		




class C_NODE_MENU_厚度修改器(bpy.types.Operator):
	bl_idname = 'node.global_node_obj_modifiers_solidify'
	bl_label = '厚度修改器'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_厚度修改器', use_transform=True)
		return {'FINISHED'}





classes = (
	C_Node_厚度修改器,
	C_NODE_MENU_厚度修改器,
	
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)


